package moore.generator.template

import java.util.ArrayList
import java.util.List
import moore.valueState

class MsfGtemplate {
	def public static String getMsfG(String asName,ArrayList<String> gOutputs,
		int StateDim, List<valueState> states
	){
		'''
		library IEEE;
		use IEEE.STD_LOGIC_1164.ALL;
		entity «asName»_G is
		PORT(
			«FOR out:gOutputs»
				«out»: out Std_logic;
			«ENDFOR»
			prev_state: in std_logic_vector («StateDim-1» downto 0)
		);
		end «asName»_G;
		
		architecture Behavioral of «asName»_G is
			«FOR out:gOutputs»
			signal «out»_INT: Std_logic:='0';
			«ENDFOR»
		begin
			«FOR out:gOutputs»
			«out»<=«out»_INT;
			«ENDFOR»
			
			uscita_process: process(prev_state)
			begin
				case prev_state is
					«FOR state:states»
					«generateStateWhene(state,gOutputs)»
					«ENDFOR»
					«generateOthers(gOutputs)»
				end case;
			end process;
		end Behavioral;
		'''
	}
	
	def private static String generateStateWhene(valueState state,ArrayList<String> gOutputs){
		'''
			when "«state.name»"=>
				«FOR out:gOutputs»
				«out»_INT<='«state.ouputValue.value.charAt(gOutputs.indexOf(out))»';
				«ENDFOR»
		'''
	}
	
	def private static String generateOthers(ArrayList<String> gOutputs){
		'''
			when others =>
				«FOR out:gOutputs»
				«out»_INT<='0';
				«ENDFOR»
		'''
	}
}